package app;

import hibernateConfig.HibernateUtil;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.SystemColor;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Set;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import model.Archivo;
import model.GrupoConfianza;
import model.Invitacion;
import model.InvitacionId;
import model.Log;
import model.TipoNotificacion;
import model.Usuario;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.Session;
import utils.ByteTools;
import utils.Terminal;
import utils.Validator;
import client.LayerClient;
import client.UserSession;
import controller.ArchivoController;
import controller.GrupoController;
import controller.InvitacionController;
import controller.LogController;
import controller.UsuarioController;

//import com.alee.laf.WebLookAndFeel;

public class GInterfaz {

	private Terminal console;
	// GUI COMPONENTS
	private JFrame frmIniciarSesin;
	private JTable tableArchivos;
	private JTextField usertField;
	private JPasswordField passField;
	private JTable membersTable;
	private JButton singInBtn;
	private JButton singOutBtn;
	private JPanel notificationPanel;
	private JPanel userPanel;
	private JPanel groupPanel;
	private JPanel filePanel;
	private JPanel configPanel;
	private JTabbedPane tabbedPane;
	private JFileChooser fileChooser;
	private JFileChooser keyChooser;
	private JFileChooser saveChooser;
	private JButton btnUpload;
	private JCheckBox chckbxDescargaShow;
	private JCheckBox chckbxCargaShow;
	private JComboBox<GrupoConfianza> comboGrupoOnGrupos;
	private JComboBox<GrupoConfianza> comboGrupoOnArchivos;
	private JButton btnEliminar;
	private JButton btnDescargar;
	private JLabel notiLabel;

	private JLabel userLabel2;
	private JLabel nameLabel2;
	private JLabel appLabel2;
	private JLabel apmLabel2;;
	private JLabel emailLabel2;
	private JLabel sexLabel2;

	// APP OBJECTS
	private static String SERVER = "192.168.0.67";// "25.15.152.2";
	private static int SERVER_PORT = 5555;
	private UserSession session;
	private LayerClient layer;
	private File temporalFile;
	private ByteTools tools;
	private UsuarioController usuarioController;
	private JFrame frameMessages;
	private GrupoController grupoController;
	private ArchivoController archivoController;
	private LogController logController;
	private InvitacionController invController;
	private PrivateKey temporalPrivateKey;
	private JLabel descripcionGrupoShow;

	/*   */
	private JDialog saveKeysDialog;
	private JDialog grupoDialog;
	private JPanel contentPane;
	private JCheckBox chckbxPrivada;
	private JCheckBox chckbxPublic;
	private JButton btnExaminar;
	private JButton btnAceptar;
	private JFileChooser chooser;
	private String pathKeys;
	private KeyPair keys;

	// GrupoDialog
	private JTextField nombreGrupoField;
	private JTextField descripcionGrupoField;
	private JCheckBox checkBoxCarga;
	private JCheckBox checkBoxDescarga;
	private String grupo;
	private boolean update;
	private GrupoConfianza grupoConfianza;
	private Session sessionHibernate;
	private JLabel msgNombreGrupo;
	private JLabel msgDescGrupo;

	// Invitacion Dialog
	private JDialog invitacionFrame;
	private JTextField inviUsuario;
	private JLabel lblPreguntaSecreta;
	private JTextArea preguntaText;
	private JButton btnEnviar;
	private JButton btnCancelar;
	private JLabel lblNewLabel;

	// RegistroUsuario Dialog
	private JDialog registroFrame;
	private JTextField nombreField;
	private JTextField apPaternoField;
	private JTextField apMaternoField;
	private JTextField emailField;
	private JTextField usuarioField;
	private JPasswordField contrasenaField;
	private JPasswordField confirmarContrasenaField;
	private JButton registerBtn;
	private JComboBox<String> sexoField;
	private JLabel msgNombre;
	private JLabel msg_ApPaterno;
	private JLabel msg_ApMaterno;
	private JLabel msg_Usuario;
	private JLabel msg_Email;
	private JLabel msg_Contrasena;
	private JLabel msg_Sexo;

	private JPanel panelMessages;
	private JLabel textMessage;
	private JLabel iconMessage;
	private static final int ERROR = 1;
	private static final int INFO = 2;
	private static final int OK = 3;

	private static int INV_AUTORIZAR = 1;
	private static int INV_PENDIENTE = 2;
	private static int INV_COMPLETA = 3;
	private static int INV_RECHAZADA = 4;

	private String[] colusername;
	private JTable tableNotifications;
	private JTable tableActividadGrupos;
	private Thread notify;
	private boolean threadFlag;
	private boolean seleccionado;

	// Autorizar inv Dialog
	private JDialog autorizarInvFrame;
	private JTextArea autorizarPregunta;
	private JTextArea autorizarRespuesta;
	private Invitacion invitacion;
	private JLabel lblUsuario;
	private String usuarioInvitado;
	private Usuario userAnadir;
	private JLabel lblGrupo;

	// Responder Inv Dialog
	private JDialog responderInvFrame;
	private JTextArea responderPregunta;
	private JTextArea responderRespuesta;
	private JLabel responderLblUsuario;
	private JLabel responderLblGrupo;

	// Cambio pass
	private JDialog cambioPassDialog;
	private JPanel contentPanePassChange;
	private JPasswordField currentPass;
	private JPasswordField newPass1;
	private JPasswordField newPass2;

	// editUser
	private JDialog editUserDialog;
	private JPanel contentPaneEditUser;
	private JTextField nombreFieldEdit;
	private JTextField apPaternoFieldEdit;
	private JTextField apMaternoFieldEdit;
	private JTextField emailFieldEdit;
	private JTextField usuarioFieldEdit;
	private JComboBox<String> sexoFieldEdit;
	private JLabel editMsg_Nombre;
	private JLabel editMsg_ApPaterno;
	private JLabel editMsg_ApMaterno;
	private JLabel editMsg_Email;

	private Timer timer;
	private int inactiveTime = 0;
	public static final int MAXTIMEMIN = 1;
	public static final int FILE_LIMIT = (3 * 1024) * 1024;

	private boolean newLogin;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {

		try {
			// WebLookAndFeel.install();
			// UIManager.setLookAndFeel("com.jtattoo.plaf.acryl.AcrylLookAndFeel");
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GInterfaz window = new GInterfaz();
					window.frmIniciarSesin.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 * 
	 * @throws Exception
	 */
	public GInterfaz() throws Exception {
		initialize();
		constructor();
	}

	/**
	 * Initialize the contents of the frame.
	 */

	private void constructor() throws Exception {
		newLogin = true;
		sessionHibernate = HibernateUtil.getSessionFactory().openSession();
		console = new Terminal("GUI");
		fileChooser = new JFileChooser();
		keyChooser = new JFileChooser();
		fileChooser.setFileFilter(new FileNameExtensionFilter("DOCUMENTOS",
				"doc", "docx", "pdf", "xls", "xlsx"));
		tools = new ByteTools();
		keyChooser
				.setFileFilter(new FileNameExtensionFilter("CLAVE KEY", "key"));
		saveChooser = new JFileChooser();
		saveChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		frameMessages = new JFrame();
		try {
			frameMessages.setAlwaysOnTop(true);
			createGrupoConfianzaDialog();
			createSaveKeysDialog();
			createInvitacionDialog();
			createRegistroUsuarioDialog();
			createAutorizarInvDialog();
			createResponderInvDialog();
			createCambioPassDialog();
			createEditarUserDialog();
			usuarioController = new UsuarioController(sessionHibernate);
			grupoController = new GrupoController(sessionHibernate);
			archivoController = new ArchivoController(sessionHibernate);
			layer = new LayerClient(SERVER, SERVER_PORT, sessionHibernate);
			timer = new Timer(5000, new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent arg0) {
					inactiveTime++;
					if (inactiveTime >= MAXTIMEMIN * 60) {
						desactivarSesion();
					}
				}
			});
			timer.start();
		} catch (Exception e) {
			e.printStackTrace();
			console.error("No se pudo conectar con el servidor :(");
			JOptionPane.showMessageDialog(frameMessages,
					"No es posible conectarse con el servidor", "Error",
					JOptionPane.ERROR_MESSAGE);
			System.exit(0);
		}
	}

	private void desactivarSesion() {
		message(INFO, "Sesión desactivada");
		session = null;
		blockSing(false);
		tabbedPane.setSelectedIndex(0);
		cleanAll();
		newLogin = true;
	}

	private void singIn(String user, String pass) throws Exception {
		Usuario usuario = (Usuario) usuarioController.getByPK(user);
		invController = new InvitacionController();
		logController = new LogController();
		if (usuario != null) {
			newLogin = false;
			if (StringUtils.equals(usuario.getPassword(), pass)) { // Se loguea
				session = new UserSession(user);
				Object[] options = { "Examinar...", "He perdido mi clave" };
				int jop = JOptionPane
						.showOptionDialog(
								frameMessages,
								"Debe proporcionar su clave privada para realizar la transaccion",
								"Clave Privada", JOptionPane.YES_NO_OPTION,
								JOptionPane.QUESTION_MESSAGE, null, options,
								options[0]);
				if (jop == JOptionPane.YES_OPTION) {
					if (keyChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
						File f = keyChooser.getSelectedFile();
						temporalPrivateKey = layer.readPrivateKey(f
								.getAbsolutePath());
						if (layer.keyLogin(session, temporalPrivateKey)) {
							blockSing(true);
							fillGruposList(grupoController
									.getAllGroupsByUser(session.getUsername()));
							message(OK, "Bienvenido " + user);
							usertField.setText("");
							passField.setText("");
							threadFlag = true;
							seleccionado = true;
							RunNotificaciones();
							userLabel2.setText(user);
							nameLabel2.setText(usuario.getNombre());
							appLabel2.setText(usuario.getApPaterno());
							apmLabel2.setText(usuario.getApMaterno());
							emailLabel2.setText(usuario.getEmail());
							sexLabel2.setText(usuario.getSexo() + "");
						} else {
							message(ERROR, layer.getLastError());
							layer.cleanError();
						}
					}
				} else if (jop == JOptionPane.NO_OPTION) {
					regenerateKeys();
				}
			} else {
				message(ERROR, "La combinación de datos es incorrecta");
				passField.setText("");
			}
		} else {
			message(ERROR, "debe proporcionar sus datos para inciar sesión");
		}
	}

	private void blockSing(boolean b) {
		singOutBtn.setEnabled(b);
		singInBtn.setEnabled(!b);
		registerBtn.setEnabled(!b);
		for (int i = 1; i < 5; i++)
			tabbedPane.setEnabledAt(i, b);
	}

	private void saveUser() throws Exception {
		if (validateUser()) {
			keys = layer.createNewKeys();
			if (usuarioController.createUser(nombreField.getText(),
					apPaternoField.getText(), apMaternoField.getText(),
					usuarioField.getText(), emailField.getText(), new String(
							contrasenaField.getPassword()), sexoField
							.getSelectedItem().toString().charAt(0), keys
							.getPublic())) {
				message(OK, "Usuario registrado correctamente");
				saveKeysDialog.setVisible(true);
				cleanUserInputs();
				registroFrame.setVisible(false);
			}
		}
	}

	private void cleanUserInputs() {
		nombreField.setText("");
		apPaternoField.setText("");
		apMaternoField.setText("");
		usuarioField.setText("");
		emailField.setText("");
		contrasenaField.setText("");
		confirmarContrasenaField.setText("");
		cleanUserErrors();
	}

	private void cleanUserErrors() {
		nombreField.setBackground(Color.WHITE);
		apPaternoField.setBackground(Color.WHITE);
		apMaternoField.setBackground(Color.WHITE);
		usuarioField.setBackground(Color.WHITE);
		emailField.setBackground(Color.WHITE);
		contrasenaField.setBackground(Color.WHITE);
		confirmarContrasenaField.setBackground(Color.WHITE);

		msgNombre.setIcon(null);
		msg_ApPaterno.setIcon(null);
		msg_ApMaterno.setIcon(null);
		msg_Usuario.setIcon(null);
		msg_Email.setIcon(null);
		msg_Contrasena.setIcon(null);
		msg_Sexo.setIcon(null);
	}

	private boolean validateUser() {
		Validator v = new Validator();
		boolean flag = true;
		cleanUserErrors();

		if (!v.isValidWord(nombreField.getText())) {
			errorMessagesOnLabel(nombreField, msgNombre,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		if (!v.isValidWord(apPaternoField.getText())) {
			errorMessagesOnLabel(apPaternoField, msg_ApPaterno,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		if (!v.isValidWord(apMaternoField.getText())) {
			errorMessagesOnLabel(apMaternoField, msg_ApMaterno,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		if (!v.isOneWord(usuarioField.getText())) {
			errorMessagesOnLabel(usuarioField, msg_Usuario,
					"El formato es incorrecto, debe ser una sola palabra alfanumerica");
			flag = false;
		} else {
			Usuario user = (Usuario) usuarioController.getByPK(usuarioField
					.getText());
			if (user != null) {
				errorMessagesOnLabel(usuarioField, msg_Usuario,
						"El nombre de usuario ya esta en uso, proporcione uno diferente");
				flag = false;
			}
		}
		if (!v.isEmail(emailField.getText())) {
			errorMessagesOnLabel(emailField, msg_Email,
					"El formato del email es incorrecto, Ej: nombre@dominio.com");
			flag = false;
		}
		if (!v.isAlfa(new String(contrasenaField.getPassword()))) {
			errorMessagesOnLabel(contrasenaField, msg_Contrasena,
					"El formato es incorrecto, debe ser Alfanumerico");
			flag = false;
		} else if (!StringUtils.equals(
				new String(contrasenaField.getPassword()), new String(
						confirmarContrasenaField.getPassword()))) {
			errorMessagesOnLabel(contrasenaField, msg_Contrasena,
					"Las contraseñas no coinciden");
			flag = false;
		}
		return flag;
	}

	private void updateInvitaciones() {

	}

	private void fillGruposList(List<GrupoConfianza> grupos) {
		comboGrupoOnGrupos.removeAllItems();
		comboGrupoOnArchivos.removeAllItems();
		for (GrupoConfianza grupoConfianza : grupos) {
			comboGrupoOnArchivos.addItem(grupoConfianza);
			if (grupoConfianza.getFkUsuarioPropietario() != null)
				if (grupoConfianza.getFkUsuarioPropietario().equals(
						session.getUsername()))
					comboGrupoOnGrupos.addItem(grupoConfianza);
		}
	}

	private void fillArchivosTable(List<Archivo> archivos) {
		console.info("Arhivos Listados: " + archivos.size());
		tableArchivos
				.setModel(new DefaultTableModel(new Object[][] {},
						new String[] { "", "Nombre", "Tama\u00F1o",
								"Fecha de subida" }));
		DefaultTableModel modelo = (DefaultTableModel) tableArchivos.getModel();
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
		Object row[] = { "", "", "", "", };

		for (int i = 0; i < archivos.size(); i++) {
			modelo.addRow(row);
			tableArchivos.setValueAt(archivos.get(i).getIdArchivo() + "", i, 0);
			tableArchivos.setValueAt(
					tools.getFileName(archivos.get(i).getRutaAcceso()), i, 1);
			tableArchivos
					.setValueAt(archivos.get(i).getTamano() + "  Kb", i, 2);
			tableArchivos.setValueAt(
					format.format(archivos.get(i).getFechaSubida()), i, 3);
		}

		DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
		centerRenderer.setHorizontalAlignment(JLabel.CENTER);
		tableArchivos.setDefaultRenderer(Object.class, centerRenderer);

		tableArchivos.getColumnModel().getColumn(0).setMaxWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setMinWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setPreferredWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setResizable(false);
	}

	private void regenerateKeys() {
		int p = JOptionPane.showConfirmDialog(frameMessages,
				"Si regenera las claves, las anteriores no podrán ser utilizadas en el sistema"
						+ ", esta seguro de volver a generar sus claves?",
				"Regeneración de claves", JOptionPane.YES_NO_OPTION,
				JOptionPane.QUESTION_MESSAGE);
		if (p == JOptionPane.YES_OPTION)
			try {
				keys = layer.createNewKeys();
				if (layer.updatePublicUserKey(session, keys.getPublic())) {
					message(OK, "nuevas Claves generadas");
					saveKeysDialog.setVisible(true);
					temporalPrivateKey = keys.getPrivate();
				} else {
					message(ERROR, "no se generarón nuevas llaves");
				}
			} catch (Exception e) {
				message(ERROR, "no se generarón nuevas llaves");
			}
	}

	private void initialize() {
		frmIniciarSesin = new JFrame();
		frmIniciarSesin.setResizable(false);
		frmIniciarSesin.setIconImage(Toolkit.getDefaultToolkit().getImage(
				GInterfaz.class.getResource("/icons/kuser.png")));
		frmIniciarSesin.setTitle("App");
		frmIniciarSesin.setBounds(100, 100, 770, 513);
		frmIniciarSesin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmIniciarSesin.getContentPane().setLayout(null);

		tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
		tabbedPane.setBounds(6, 6, 750, 422);
		tabbedPane.addMouseMotionListener(new MouseMotionListener() {

			@Override
			public void mouseMoved(MouseEvent arg0) {
				inactiveTime = 0;
			}

			@Override
			public void mouseDragged(MouseEvent arg0) {

			}
		});

		frmIniciarSesin.getContentPane().add(tabbedPane);
		userPanel = new JPanel();
		tabbedPane.addTab(
				"",
				new ImageIcon(GInterfaz.class
						.getResource("/icons/xfce4-session.png")), userPanel,
				"Usuario");
		userPanel.setLayout(null);

		JPanel sessionPanel = new JPanel();
		sessionPanel.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null), "", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		sessionPanel.setBounds(12, 12, 643, 395);
		userPanel.add(sessionPanel);
		sessionPanel.setLayout(null);

		JPanel panel_6 = new JPanel();
		panel_6.setBorder(new LineBorder(new Color(0, 0, 0), 1, true));
		panel_6.setBounds(154, 53, 291, 302);
		sessionPanel.add(panel_6);
		panel_6.setLayout(null);

		JLabel lblLoginDeUsuario = new JLabel("Login de Usuario");
		lblLoginDeUsuario.setHorizontalAlignment(SwingConstants.CENTER);
		lblLoginDeUsuario.setBounds(12, 12, 267, 32);
		panel_6.add(lblLoginDeUsuario);
		lblLoginDeUsuario.setFont(new Font("Tahoma", Font.PLAIN, 26));

		JLabel lblUsuario = new JLabel("Usuario:");
		lblUsuario.setFont(new Font("Tahoma", Font.PLAIN, 15));
		lblUsuario.setBounds(56, 100, 60, 14);
		panel_6.add(lblUsuario);

		usertField = new JTextField();
		usertField.setToolTipText("Ingrese su nombre de usuario");
		usertField.setBounds(56, 118, 212, 32);
		panel_6.add(usertField);
		usertField.setColumns(10);

		JLabel lblContrasea = new JLabel("Contrase\u00F1a:");
		lblContrasea.setFont(new Font("Tahoma", Font.PLAIN, 15));
		lblContrasea.setBounds(56, 162, 95, 14);
		panel_6.add(lblContrasea);

		passField = new JPasswordField();
		passField.setBounds(56, 178, 212, 32);
		passField.addKeyListener(new KeyListener() {
			@Override
			public void keyTyped(KeyEvent ev) {

			}

			@Override
			public void keyReleased(KeyEvent ev) {
				if (newLogin) {
					if (ev.getKeyCode() == KeyEvent.VK_ENTER) {
						try {
							singIn(usertField.getText(),
									new String(passField.getPassword()));
						} catch (Exception e1) {
							e1.printStackTrace();
						}
					}
				}
			}

			@Override
			public void keyPressed(KeyEvent ev) {

			}
		});
		;
		panel_6.add(passField);

		singInBtn = new JButton("");
		singInBtn.setBounds(236, 221, 32, 32);
		panel_6.add(singInBtn);
		singInBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					singIn(usertField.getText(),
							new String(passField.getPassword()));
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
		});
		singInBtn.setToolTipText("Iniciar Sesi\u00F3n\r\n");
		singInBtn.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/xfce-system-exit.png")));

		singOutBtn = new JButton("");
		singOutBtn.setBounds(194, 221, 32, 32);
		panel_6.add(singOutBtn);
		singOutBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				blockSing(false);
				threadFlag = false;
				cleanAll();
				newLogin = true;
			}
		});
		singOutBtn.setEnabled(false);
		singOutBtn.setToolTipText("Cerrar Sesi\u00F3n");
		singOutBtn.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/xfsm-logout.png")));

		JLabel lblNewLabel_2 = new JLabel("");
		lblNewLabel_2.setBounds(14, 178, 32, 32);
		panel_6.add(lblNewLabel_2);
		lblNewLabel_2.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-dropbox-unsyncable.png")));

		JLabel label_1 = new JLabel("");
		label_1.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-personal.png")));
		label_1.setBounds(12, 118, 32, 32);
		panel_6.add(label_1);

		JLabel lblProporcioneTodosLos = new JLabel(
				"Proporcione todos los campos siguientes");
		lblProporcioneTodosLos.setHorizontalAlignment(SwingConstants.CENTER);
		lblProporcioneTodosLos.setFont(new Font("Tahoma", Font.PLAIN, 12));
		lblProporcioneTodosLos.setBounds(12, 56, 267, 15);
		panel_6.add(lblProporcioneTodosLos);

		JLabel lblnoEstasRegistrado = new JLabel("¿No estás registrado?");
		lblnoEstasRegistrado.setFont(new Font("Tahoma", Font.PLAIN, 16));
		lblnoEstasRegistrado.setBounds(317, 13, 152, 29);
		sessionPanel.add(lblnoEstasRegistrado);

		registerBtn = new JButton("Registrarse");
		registerBtn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				registroFrame.setVisible(true);
			}
		});
		registerBtn.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/format-text-direction-rtl.png")));
		registerBtn.setFont(new Font("Tahoma", Font.PLAIN, 14));
		registerBtn.setBounds(479, 8, 152, 36);
		sessionPanel.add(registerBtn);

		groupPanel = new JPanel();
		tabbedPane.addTab("",
				new ImageIcon(GInterfaz.class.getResource("/icons/kuser.png")),
				groupPanel, "Grupos");
		tabbedPane.setEnabledAt(1, false);
		groupPanel.setLayout(null);

		JPanel panel_4 = new JPanel();
		panel_4.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null),
				"Administraci\u00F3n de Grupos", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panel_4.setBounds(10, 11, 650, 395);
		groupPanel.add(panel_4);
		panel_4.setLayout(null);

		JLabel lblNewLabel_3 = new JLabel("");
		lblNewLabel_3.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/stock_people.png")));
		lblNewLabel_3.setBounds(23, 35, 32, 32);
		panel_4.add(lblNewLabel_3);

		JLabel lblGrupo_1 = new JLabel("Grupo:");
		lblGrupo_1.setBounds(81, 39, 46, 14);
		panel_4.add(lblGrupo_1);

		colusername = new String[] { "Usuario" };

		comboGrupoOnGrupos = new JComboBox<GrupoConfianza>();
		comboGrupoOnGrupos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				GrupoConfianza group;
				DefaultTableModel model = new DefaultTableModel();
				group = (GrupoConfianza) comboGrupoOnGrupos.getSelectedItem();
				if (group != null) {
					group = (GrupoConfianza) grupoController.getByPK(group
							.getIdGrupo());
					if (group != null) {
						descripcionGrupoShow.setText(group.getDescripcion());
						chckbxCargaShow.setSelected(group.isPermisoSubida());
						chckbxDescargaShow.setSelected(group
								.isPermisoDescarga());

						// Update membersTable
						model.setColumnIdentifiers(colusername);
						membersTable.setModel(model);

						console.info("comboGrupoOnGrupos Miembros: "
								+ (group.getUsuarios().size() - 1));

						for (Usuario us : group.getUsuarios()) {
							if (!us.getIdNickName().equals(
									session.getUsername()))
								model.addRow(new String[] { us.getIdNickName() });
						}
					}
				} else {
					membersTable.setModel(model);
					model.setColumnIdentifiers(colusername);
				}
			}
		});
		comboGrupoOnGrupos.setBounds(122, 36, 136, 25);
		panel_4.add(comboGrupoOnGrupos);

		JLabel lblNewLabel_4 = new JLabel("");
		lblNewLabel_4.setBounds(23, 87, 32, 32);
		panel_4.add(lblNewLabel_4);
		lblNewLabel_4.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/goa-account.png")));

		JLabel lblDescripcin = new JLabel("Descripci\u00F3n:");
		lblDescripcin.setBounds(81, 76, 70, 25);
		panel_4.add(lblDescripcin);

		JLabel lblPermisos = new JLabel("Permisos:");
		lblPermisos.setBounds(81, 112, 70, 14);
		panel_4.add(lblPermisos);

		chckbxDescargaShow = new JCheckBox("Descarga de Archivos");
		chckbxDescargaShow.setEnabled(false);
		chckbxDescargaShow.setBounds(157, 108, 163, 23);
		panel_4.add(chckbxDescargaShow);

		chckbxCargaShow = new JCheckBox("Carga de Archivos");
		chckbxCargaShow.setEnabled(false);
		chckbxCargaShow.setBounds(322, 108, 146, 23);
		panel_4.add(chckbxCargaShow);

		JButton btnCrear = new JButton("");
		btnCrear.setToolTipText("Nuevo grupo");
		btnCrear.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				iniciarGrupoDialog("");
				grupoDialog.setVisible(true);
			}
		});
		btnCrear.setBounds(318, 35, 32, 32);
		panel_4.add(btnCrear);
		btnCrear.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/edit-add.png")));

		JButton btnEditar = new JButton("");
		btnEditar.setToolTipText("Editar grupo");
		btnEditar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				GrupoConfianza g;
				if ((g = (GrupoConfianza) comboGrupoOnGrupos.getSelectedItem()) != null) {
					iniciarGrupoDialog(g.getIdGrupo());
					grupoDialog.setVisible(true);

				} else {
					message(ERROR, "No hay ha seleccionado un grupo");
				}
			}
		});
		btnEditar.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/format-text-direction-rtl.png")));
		btnEditar.setBounds(276, 35, 32, 32);
		panel_4.add(btnEditar);

		JPanel panel_5 = new JPanel();
		panel_5.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null), "Miembros",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel_5.setBounds(10, 148, 630, 236);
		panel_4.add(panel_5);
		panel_5.setLayout(null);

		JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(10, 24, 271, 201);
		panel_5.add(scrollPane_1);

		membersTable = new JTable();
		membersTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		membersTable.setModel(new DefaultTableModel(new Object[][] {},
				new String[] { "Miembros" }) {
			/**
					 * 
					 */
			private static final long serialVersionUID = 1L;
			boolean[] columnEditables = new boolean[] { false };

			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		membersTable.getColumnModel().getColumn(0).setResizable(false);
		scrollPane_1.setViewportView(membersTable);

		JButton btnNewButton_6 = new JButton("");
		btnNewButton_6.setToolTipText("Invitar a usuario a grupo");
		btnNewButton_6.addActionListener(new ActionListener() {
			// ASD
			public void actionPerformed(ActionEvent arg0) {
				inviUsuario.setEditable(false);
				createInvitacionDialog();
				invitacionFrame.setVisible(true);
			}
		});
		btnNewButton_6.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-new.png")));
		btnNewButton_6.setBounds(291, 23, 32, 32);
		panel_5.add(btnNewButton_6);

		JButton btnEliminarUsuario = new JButton("");
		btnEliminarUsuario.setToolTipText("Eliminar usuario del grupo");
		btnEliminarUsuario.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				GrupoConfianza group;
				String selectedUser = null;
				if ((group = (GrupoConfianza) comboGrupoOnGrupos
						.getSelectedItem()) != null) {
					try {
						selectedUser = (String) membersTable.getValueAt(
								membersTable.getSelectedRow(),
								membersTable.getSelectedColumn());
					} catch (Exception ex) {
						message(INFO, "Debe seleccionar un usuario");
					}
					if (selectedUser != null) {
						group = (GrupoConfianza) grupoController.getByPK(group
								.getIdGrupo());
						int p = JOptionPane
								.showConfirmDialog(
										frameMessages,
										"Si elimina a un usuario, este no podra acceder a los datos del grupo,\n esta seguro de eliminar a este usuario?",
										"Eliminar usuario de grupo",
										JOptionPane.YES_NO_OPTION,
										JOptionPane.QUESTION_MESSAGE);
						if (p == JOptionPane.YES_OPTION) {
							group.getUsuarios().remove(
									usuarioController.getByPK(selectedUser));
							if (grupoController.update(group)) {
								message(OK,
										selectedUser + " eliminado del grupo "
												+ group.getIdGrupo());
								invController.createInvitacion(
										session.getUsername(), selectedUser,
										group.getIdGrupo(), "", "", 2);
								DefaultTableModel model = new DefaultTableModel();
								membersTable.setModel(model);
								model.setColumnIdentifiers(colusername);

								console.info("Miembros: "
										+ (group.getUsuarios().size() - 1));

								for (Usuario us : group.getUsuarios()) {
									if (!us.getIdNickName().equals(
											session.getUsername()))
										model.addRow(new String[] { us
												.getIdNickName() });
								}
							} else {
								message(ERROR,
										"No fue posible eliminar el usuario del grupo");
							}
						}
					} else {
						message(ERROR, "Debe seleccionar un usuario");
					}
				} else {
					message(ERROR, "Debe seleccionar un grupo");
				}
			}
		});
		btnEliminarUsuario.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-noread.png")));
		btnEliminarUsuario.setBounds(291, 66, 32, 32);
		panel_5.add(btnEliminarUsuario);

		descripcionGrupoShow = new JLabel("");
		descripcionGrupoShow.setEnabled(false);
		descripcionGrupoShow.setBounds(161, 79, 311, 22);
		panel_4.add(descripcionGrupoShow);

		JButton btnNewButton_1 = new JButton("");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int p = JOptionPane.showConfirmDialog(frameMessages,
						"Esta seguro de eliminar este grupo?",
						"Eliminar grupo", JOptionPane.YES_NO_OPTION,
						JOptionPane.QUESTION_MESSAGE);
				if (p == JOptionPane.YES_OPTION) {
					GrupoConfianza group;
					if ((group = (GrupoConfianza) comboGrupoOnGrupos
							.getSelectedItem()) != null) {
						String grupo = group.getIdGrupo();
						console.info("Grupo> " + grupo);
						group = (GrupoConfianza) grupoController.getByPK(grupo);
						Set<Usuario> users = group.getUsuarios();
						if (grupoController.softDelete(group.getIdGrupo())) {
							console.info("Grupo> " + grupo);
							if (layer.deleteGroup(grupo)) {
								message(OK, "El grupo " + grupo
										+ " se eliminó correctamente");
								for (Usuario usr : users) {
									if (!usr.getIdNickName().equals(
											session.getUsername()))
										invController.createInvitacion(
												session.getUsername(),
												usr.getIdNickName(),
												group.getIdGrupo(), "", "", 3);
								}
								fillGruposList(grupoController
										.getAllGroupsByUser(session
												.getUsername()));
							} else {
								message(ERROR, layer.getLastError());
							}
						}
					}
				}
			}
		});

		btnNewButton_1.setToolTipText("Eliminar grupo");
		btnNewButton_1.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/window-close.png")));
		btnNewButton_1.setBounds(360, 35, 32, 32);
		panel_4.add(btnNewButton_1);

		filePanel = new JPanel();
		tabbedPane.addTab("",
				new ImageIcon(GInterfaz.class.getResource("/icons/nfs.png")),
				filePanel, "Archivos");
		tabbedPane.setEnabledAt(2, false);
		filePanel.setLayout(null);

		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED,
				null, null), "Archivos de Grupo", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panel.setBounds(10, 11, 650, 396);
		filePanel.add(panel);
		panel.setLayout(null);

		JLabel lblGrupo = new JLabel("Grupo:");
		lblGrupo.setBounds(10, 23, 46, 14);
		panel.add(lblGrupo);

		comboGrupoOnArchivos = new JComboBox<GrupoConfianza>();
		comboGrupoOnArchivos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (comboGrupoOnArchivos.getSelectedItem() != null) {
					GrupoConfianza group = (GrupoConfianza) comboGrupoOnArchivos
							.getSelectedItem();
					group = (GrupoConfianza) grupoController.getByPK(group
							.getIdGrupo());
					session.setVariable("grupo", group.getIdGrupo());
					fillArchivosTable(archivoController.getByGroup(group
							.getIdGrupo()));
					if (group.getFkUsuarioPropietario() != null)
						if (group.getFkUsuarioPropietario().equals(
								session.getUsername())) {
							btnEliminar.setEnabled(true);
							btnDescargar.setEnabled(true);
							btnUpload.setEnabled(true);
						} else {
							btnEliminar.setEnabled(group.isPermisoSubida());
							btnDescargar.setEnabled(group.isPermisoDescarga());
							btnUpload.setEnabled(group.isPermisoSubida());
						}
				}
			}
		});
		comboGrupoOnArchivos.setBounds(54, 20, 176, 22);
		panel.add(comboGrupoOnArchivos);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 56, 630, 288);
		panel.add(scrollPane);

		tableArchivos = new JTable();
		tableArchivos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tableArchivos
				.setModel(new DefaultTableModel(new Object[][] {},
						new String[] { "", "Nombre", "Tama\u00F1o",
								"Fecha de subida" }) {
					/**
									 * 
									 */
					private static final long serialVersionUID = 1L;
					boolean[] columnEditables = new boolean[] { false, false,
							false, false };

					public boolean isCellEditable(int row, int column) {
						return columnEditables[column];
					}
				});
		tableArchivos.getColumnModel().getColumn(0).setResizable(false);
		tableArchivos.getColumnModel().getColumn(1).setResizable(false);
		tableArchivos.getColumnModel().getColumn(2).setResizable(false);
		tableArchivos.getColumnModel().getColumn(3).setResizable(false);
		tableArchivos.getColumnModel().getColumn(3).setPreferredWidth(94);
		scrollPane.setViewportView(tableArchivos);

		btnDescargar = new JButton("");
		btnDescargar.setToolTipText("Descargar archivo");
		btnDescargar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					if (tableArchivos.getRowCount() > 0) {
						Integer id = Integer.parseInt((String) tableArchivos
								.getValueAt(tableArchivos.getSelectedRow(), 0));
						String filename = (String) tableArchivos.getValueAt(
								tableArchivos.getSelectedRow(), 1);
						if (saveChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
							console.info(saveChooser.getSelectedFile()
									.getAbsoluteFile() + "\\" + filename);
							if (id != null) {
								if (layer.downloadFile(session, id, saveChooser
										.getSelectedFile().getAbsoluteFile()
										+ "\\" + filename, temporalPrivateKey)) {
									message(OK,
											"Archivo descargado correctamente");
								} else {
									message(ERROR,
											"No fue posible descargar el archivo"
													+ layer.getLastError());
									layer.cleanError();
								}
							} else {
								message(INFO, "Debe seleccionar una archivo");
							}
						}
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		btnDescargar.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/stock_inbox.png")));
		btnDescargar.setBounds(566, 355, 32, 32);
		panel.add(btnDescargar);

		btnEliminar = new JButton("");
		btnEliminar.setToolTipText("Eliminar archivo");
		btnEliminar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					Integer id = Integer.parseInt((String) tableArchivos
							.getValueAt(tableArchivos.getSelectedRow(), 0));
					int p = JOptionPane.showConfirmDialog(frameMessages,
							"Esta seguro de eliminar el archivo?",
							"Eliminar archivo", JOptionPane.YES_NO_OPTION,
							JOptionPane.QUESTION_MESSAGE);
					if (p == JOptionPane.YES_OPTION)
						try {
							console.info("Borrar: " + id);
							if (layer.deleteFile(session, id,
									temporalPrivateKey)) {
								message(OK, "Archivo borrado correctamente");
								fillArchivosTable(archivoController
										.getByGroup(session
												.getVariable("grupo")
												.toString()));
							} else {
								message(ERROR,
										"No fue posible borrar el archivo"
												+ layer.getLastError());
								layer.cleanError();
							}
						} catch (Exception e) {
							message(ERROR, "No fue posible borrar el archivo"
									+ layer.getLastError());
							layer.cleanError();
						}
				} catch (Exception e) {
					message(INFO, "Debe seleccionar un archivo");
				}
			}
		});
		btnEliminar.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-noread.png")));
		btnEliminar.setBounds(524, 355, 32, 32);
		panel.add(btnEliminar);

		btnUpload = new JButton("");
		btnUpload.setToolTipText("Subir archivo nuevo");
		btnUpload.setBounds(608, 355, 32, 32);
		panel.add(btnUpload);
		btnUpload.setEnabled(false);
		btnUpload.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (fileChooser.showOpenDialog(frameMessages) == JFileChooser.APPROVE_OPTION) {
					temporalFile = fileChooser.getSelectedFile();
					console.info("Archivo Seleccionado: "
							+ temporalFile.getName());
					if (temporalFile.length() <= FILE_LIMIT) {
						try {
							if (layer.uploadFile(session, temporalFile,
									temporalPrivateKey)) {
								message(OK,
										"Archivo cargado correctamente en el servidor");
								fillArchivosTable(archivoController
										.getByGroup(session
												.getVariable("grupo")
												.toString()));
							} else {
								message(ERROR,
										"No fue posible cargar el archivo en el servidor"
												+ layer.getLastError());
								layer.cleanError();
							}
						} catch (Exception ex) {
							console.exception(ex.toString());
						}
					} else {
						message(ERROR, "El archivo no debe superar "
								+ FILE_LIMIT / 1024 + "KB de tamaño");
						JOptionPane.showMessageDialog(frameMessages,
								"El archivo seleccionado es muy grande.");
					}
				}
			}
		});
		btnUpload.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/stock_outbox.png")));
		tabbedPane.setEnabledAt(2, false);

		notificationPanel = new JPanel();
		tabbedPane.addTab(
				"",
				new ImageIcon(GInterfaz.class
						.getResource("/icons/mail-mark-junk.png")),
				notificationPanel, "Notificaciones");
		tabbedPane.setEnabledAt(3, false);
		notificationPanel.setLayout(null);

		JPanel panel_7 = new JPanel();
		panel_7.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null), "Notificaciones",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel_7.setBounds(10, 11, 645, 248);
		notificationPanel.add(panel_7);
		panel_7.setLayout(null);

		JScrollPane scrollPane_2 = new JScrollPane();
		scrollPane_2.setBounds(10, 21, 625, 216);
		panel_7.add(scrollPane_2);

		tableNotifications = new JTable() {
			/**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@SuppressWarnings({ "unchecked", "rawtypes" })
			public Class getColumnClass(int column) {
				return getValueAt(0, column).getClass();
			}
		};
		tableNotifications.addFocusListener(new FocusAdapter() {
			@Override
			public void focusLost(FocusEvent arg0) {
				seleccionado = true;
			}
		});
		tableNotifications.setDefaultRenderer(ImageIcon.class,
				new ImageRender());
		tableNotifications.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent me) {
				int row = tableNotifications.getSelectedRow();
				console.info(row + "");
				if (me.getClickCount() == 2) {
					notificationAction(tableNotifications.getValueAt(row, 0)
							+ "", tableNotifications.getValueAt(row, 1) + "",
							(Integer) tableNotifications.getValueAt(row, 3));
				}
			}

			@Override
			public void mousePressed(MouseEvent arg0) {
				seleccionado = false;
			}
		});
		tableNotifications
				.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		scrollPane_2.setViewportView(tableNotifications);

		JPanel panel_8 = new JPanel();
		panel_8.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null), "Ultima actividad de grupo",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel_8.setBounds(10, 270, 645, 139);
		notificationPanel.add(panel_8);
		panel_8.setLayout(null);

		JScrollPane scrollPane_4 = new JScrollPane();
		scrollPane_4.setBounds(10, 21, 625, 107);
		panel_8.add(scrollPane_4);

		tableActividadGrupos = new JTable();
		tableActividadGrupos.setEnabled(false);
		tableActividadGrupos
				.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		scrollPane_4.setViewportView(tableActividadGrupos);

		configPanel = new JPanel();
		tabbedPane.addTab(
				"",
				new ImageIcon(GInterfaz.class
						.getResource("/icons/gnome-settings.png")),
				configPanel, "Configuracion");
		tabbedPane.setEnabledAt(4, false);
		configPanel.setLayout(null);

		JPanel dataPanel = new JPanel();
		dataPanel.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null), "Datos de Usuario",
				TitledBorder.LEADING, TitledBorder.TOP, null, null));
		dataPanel.setBounds(12, 12, 643, 153);
		configPanel.add(dataPanel);
		dataPanel.setLayout(null);

		JLabel lblNewLabel = new JLabel("Nombre");
		lblNewLabel.setBounds(68, 57, 48, 16);
		dataPanel.add(lblNewLabel);

		JLabel lblNewLabel_5 = new JLabel("Apellido Pateno:");
		lblNewLabel_5.setBounds(68, 111, 84, 16);
		dataPanel.add(lblNewLabel_5);

		JLabel lblNewLabel_6 = new JLabel("Apellido Materno:");
		lblNewLabel_6.setBounds(68, 84, 84, 16);
		dataPanel.add(lblNewLabel_6);

		JLabel lblNewLabel_7 = new JLabel("E-Mail:");
		lblNewLabel_7.setBounds(300, 57, 40, 16);
		dataPanel.add(lblNewLabel_7);

		userLabel2 = new JLabel("");
		userLabel2.setFont(new Font("Tahoma", Font.BOLD, 16));
		userLabel2.setBounds(68, 26, 125, 16);
		dataPanel.add(userLabel2);

		JLabel lblNewLabel_11 = new JLabel("");
		lblNewLabel_11.setBounds(212, 144, 61, 16);
		dataPanel.add(lblNewLabel_11);

		JLabel lblSexo_1 = new JLabel("Sexo:");
		lblSexo_1.setBounds(300, 84, 61, 16);
		dataPanel.add(lblSexo_1);

		JLabel label = new JLabel("");
		label.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/goa-account2.png")));
		label.setBounds(10, 25, 48, 67);
		dataPanel.add(label);

		nameLabel2 = new JLabel("");
		nameLabel2.setBounds(156, 58, 117, 14);
		dataPanel.add(nameLabel2);

		appLabel2 = new JLabel("");
		appLabel2.setBounds(156, 86, 117, 14);
		dataPanel.add(appLabel2);

		apmLabel2 = new JLabel("");
		apmLabel2.setBounds(156, 112, 117, 14);
		dataPanel.add(apmLabel2);

		emailLabel2 = new JLabel("");
		emailLabel2.setBounds(350, 58, 179, 14);
		dataPanel.add(emailLabel2);

		sexLabel2 = new JLabel("");
		sexLabel2.setBounds(350, 85, 46, 14);
		dataPanel.add(sexLabel2);

		JButton btnEditar_1 = new JButton("");
		btnEditar_1.setToolTipText("Editar");
		btnEditar_1.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/gtk-edit.png")));
		btnEditar_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Usuario u = (Usuario) usuarioController.getByPK(session
						.getUsername());
				if (u != null) {
					nombreFieldEdit.setText(u.getNombre());
					apPaternoFieldEdit.setText(u.getApPaterno());
					apMaternoFieldEdit.setText(u.getApMaterno());
					emailFieldEdit.setText(u.getEmail());
					usuarioFieldEdit.setText(u.getIdNickName());
					editUserDialog.setVisible(true);
				}
			}
		});
		btnEditar_1.setBounds(545, 102, 40, 40);
		dataPanel.add(btnEditar_1);

		JButton button = new JButton("");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				cambioPassDialog.setVisible(true);
			}
		});
		button.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/lock.png")));
		button.setToolTipText("Cambiar contraseña");
		button.setBounds(593, 102, 40, 40);
		dataPanel.add(button);

		JPanel panel_1 = new JPanel();
		panel_1.setBorder(new TitledBorder(new EtchedBorder(
				EtchedBorder.LOWERED, null, null),
				"Regeneraci\u00F3n de Claves", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panel_1.setBounds(12, 177, 643, 104);
		configPanel.add(panel_1);
		panel_1.setLayout(null);

		JLabel lblNewLabel_8 = new JLabel("");
		lblNewLabel_8.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/reload.png")));
		lblNewLabel_8.setBounds(10, 26, 48, 48);
		panel_1.add(lblNewLabel_8);

		JLabel lblNewLabel_9 = new JLabel(
				"Es recomendable generar de nuevo sus claves periódicamente  para aumentar la seguridad del sistema");
		lblNewLabel_9.setBounds(85, 26, 497, 14);
		panel_1.add(lblNewLabel_9);

		JButton btnNewButton_2 = new JButton("");
		btnNewButton_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				regenerateKeys();
			}
		});
		btnNewButton_2.setToolTipText("Regenerar");
		btnNewButton_2.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-synchronizing.png")));
		btnNewButton_2.setBounds(293, 51, 32, 32);
		panel_1.add(btnNewButton_2);
		tabbedPane.setEnabledAt(3, false);

		panelMessages = new JPanel();
		panelMessages.setForeground(Color.LIGHT_GRAY);
		panelMessages.setBorder(new LineBorder(new Color(192, 192, 192), 1,
				true));
		panelMessages.setBounds(6, 439, 750, 35);
		frmIniciarSesin.getContentPane().add(panelMessages);
		panelMessages.setLayout(null);

		iconMessage = new JLabel("");
		iconMessage.setBounds(10, 0, 24, 35);
		panelMessages.add(iconMessage);

		textMessage = new JLabel("");
		textMessage.setFont(new Font("Tahoma", Font.BOLD, 11));
		textMessage.setBounds(36, 11, 633, 16);
		panelMessages.add(textMessage);

		notiLabel = new JLabel("");
		notiLabel.setHorizontalAlignment(SwingConstants.CENTER);
		notiLabel.setBackground(SystemColor.textHighlight);
		notiLabel.setFont(new Font("Tahoma", Font.BOLD, 14));
		notiLabel.setForeground(new Color(0, 128, 0));
		notiLabel.setBounds(681, 0, 59, 35);
		panelMessages.add(notiLabel);
	}

	private void createSaveKeysDialog() {
		saveKeysDialog = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		saveKeysDialog.setIconImage(Toolkit.getDefaultToolkit().getImage(
				GInterfaz.class
						.getResource("/icons/emblem-dropbox-unsyncable.png")));
		saveKeysDialog.setTitle("Guardar llaves generadas");
		saveKeysDialog.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		saveKeysDialog.setBounds(100, 100, 412, 168);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		saveKeysDialog.setContentPane(contentPane);
		contentPane.setLayout(null);

		JLabel lblNewLabel = new JLabel("");
		lblNewLabel.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-dropbox-unsyncable.png")));
		lblNewLabel.setBounds(10, 11, 50, 48);
		contentPane.add(lblNewLabel);

		JLabel lblLasLlavesDe = new JLabel(
				"Las llaves de usuario fuer\u00F3n generadas correctamente,");
		lblLasLlavesDe.setBounds(70, 11, 312, 20);
		contentPane.add(lblLasLlavesDe);

		JLabel lblDebeElegirLa = new JLabel(
				" debe elegir la ubicaci\u00F3n donde se guardar\u00E1n las llaves.");
		lblDebeElegirLa.setBounds(68, 31, 314, 14);
		contentPane.add(lblDebeElegirLa);

		chckbxPrivada = new JCheckBox("Privada");
		chckbxPrivada.setEnabled(false);
		chckbxPrivada.setSelected(true);
		chckbxPrivada.setBounds(37, 66, 86, 23);
		contentPane.add(chckbxPrivada);

		chckbxPublic = new JCheckBox("P\u00FAblica");
		chckbxPublic.setBounds(37, 92, 97, 23);
		contentPane.add(chckbxPublic);

		chooser = new JFileChooser();
		chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

		btnExaminar = new JButton("Examinar...");
		btnExaminar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
					pathKeys = chooser.getSelectedFile().getAbsolutePath();
					console.info("Destino seleccionado: " + pathKeys);
					btnAceptar.setEnabled(true);
				}
			}
		});
		btnExaminar.setBounds(293, 56, 89, 23);
		contentPane.add(btnExaminar);

		btnAceptar = new JButton("Aceptar");
		btnAceptar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					saveKeysDialog.setVisible(false);
					if (chckbxPublic.isSelected())
						layer.savePublic(pathKeys + "/public.key",
								keys.getPublic());
					layer.savePrivate(pathKeys + "/private.key",
							keys.getPrivate());
					console.info("Privada: " + pathKeys + "\\private.key");
					console.info("Publica: " + pathKeys + "\\public.key");
					message(OK, "Llaves de usuario guardadas correctamente");
				} catch (Exception e) {
					message(ERROR,
							"No fue posible guardar las llaves de usuario");
					e.printStackTrace();
				}
			}
		});

		btnAceptar.setEnabled(false);
		btnAceptar.setBounds(293, 92, 89, 23);
		contentPane.add(btnAceptar);
	}

	// GrupoDialog
	private void createGrupoConfianzaDialog() {
		grupoDialog = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		grupoDialog.setTitle("Grupo de confianza");
		grupoDialog.setAlwaysOnTop(true);
		grupoDialog.setIconImage(Toolkit.getDefaultToolkit().getImage(
				GrupoDialog.class.getResource("/icons/emblem-people.png")));
		grupoDialog.setBounds(100, 100, 513, 222);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		grupoDialog.setContentPane(contentPane);
		contentPane.setLayout(null);

		JPanel panel = new JPanel();
		panel.setBounds(5, 5, 482, 179);
		panel.setBorder(UIManager.getBorder("TitledBorder.border"));
		contentPane.add(panel);
		panel.setLayout(null);

		JLabel label = new JLabel("Nombre:");
		label.setBounds(108, 32, 55, 14);
		panel.add(label);

		JLabel label_1 = new JLabel("");
		label_1.setIcon(new ImageIcon(GrupoDialog.class
				.getResource("/icons/kuser.png")));
		label_1.setBounds(10, 11, 65, 73);
		panel.add(label_1);

		JLabel label_2 = new JLabel("Descripción:");
		label_2.setBounds(91, 59, 72, 14);
		panel.add(label_2);

		nombreGrupoField = new JTextField();
		nombreGrupoField.setColumns(10);
		nombreGrupoField.setBounds(173, 26, 275, 23);
		panel.add(nombreGrupoField);

		descripcionGrupoField = new JTextField();
		descripcionGrupoField.setColumns(10);
		descripcionGrupoField.setBounds(173, 54, 275, 23);
		panel.add(descripcionGrupoField);

		JButton buttonGuardarGrupo = new JButton("Guardar");
		buttonGuardarGrupo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) throws HeadlessException {
				if (update) {
					if (updateGrupo()) {
						JOptionPane.showMessageDialog(frameMessages,
								"Grupo modificado correctamente");
						cleanInputsGrupo();
						descripcionGrupoShow.setText(grupoConfianza
								.getDescripcion());
						chckbxCargaShow.setSelected(grupoConfianza
								.isPermisoSubida());
						chckbxDescargaShow.setSelected(grupoConfianza
								.isPermisoDescarga());
						grupoDialog.setVisible(false);
					} else {
						JOptionPane.showMessageDialog(frameMessages,
								"Grupo no modificado");
						cleanInputsGrupo();
						grupoDialog.setVisible(false);
					}
				} else {
					try {
						if (saveGrupo()) {
							message(OK, "Grupo creado correctamente");
							cleanInputsGrupo();
							fillGruposList(grupoController
									.getAllGroupsByUser(session.getUsername()));
							grupoDialog.setVisible(false);
						} else {
							message(ERROR, "No fue posible crear el grupo");
						}
					} catch (Exception e1) {
						e1.printStackTrace();
					}
				}
			}
		});
		buttonGuardarGrupo.setIcon(new ImageIcon(GrupoDialog.class
				.getResource("/icons/dialog-ok.png")));
		buttonGuardarGrupo.setBounds(366, 133, 110, 35);
		panel.add(buttonGuardarGrupo);

		checkBoxCarga = new JCheckBox("Carga de Archivos");
		checkBoxCarga.setBounds(313, 81, 120, 23);
		panel.add(checkBoxCarga);

		checkBoxDescarga = new JCheckBox("Descarga de Archivos");
		checkBoxDescarga.setBounds(173, 81, 138, 23);
		panel.add(checkBoxDescarga);

		JLabel label_3 = new JLabel("Permisos:");
		label_3.setBounds(101, 84, 55, 14);
		panel.add(label_3);

		JButton btnCancelar = new JButton("Cancelar");
		btnCancelar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				grupoDialog.setVisible(false);
				cleanInputsGrupo();
			}
		});
		btnCancelar.setIcon(new ImageIcon(GrupoDialog.class
				.getResource("/icons/window-close.png")));
		btnCancelar.setBounds(246, 133, 110, 35);
		panel.add(btnCancelar);

		msgNombreGrupo = new JLabel("");
		msgNombreGrupo.setBounds(458, 30, 16, 16);
		panel.add(msgNombreGrupo);

		msgDescGrupo = new JLabel("");
		msgDescGrupo.setBounds(458, 59, 16, 16);
		panel.add(msgDescGrupo);

		grupoDialog.addWindowListener(new java.awt.event.WindowAdapter() {
			@Override
			public void windowClosing(java.awt.event.WindowEvent windowEvent) {
				cleanInputsGrupo();
			}
		});
	}

	private void cleanInputsGrupo() {
		nombreField.setEnabled(true);
		nombreGrupoField.setText("");
		descripcionGrupoField.setText("");
		checkBoxCarga.setSelected(false);
		checkBoxDescarga.setSelected(false);
	}

	private boolean saveGrupo() throws Exception {
		if (validateGrupo()) {
			return layer.createNewGroupDir(session.getUsername(),
					nombreGrupoField.getText(),
					descripcionGrupoField.getText(),
					checkBoxDescarga.isSelected(), checkBoxCarga.isSelected());
		}
		return false;
	}

	private boolean validateGrupo() {
		Validator v = new Validator();
		boolean flag = true;
		cleanUserErrors();

		if (!v.isOneWord(nombreGrupoField.getText())) {
			errorMessagesOnLabel(nombreGrupoField, msgNombreGrupo,
					"El formato es incorrecto, debe ser una sola palabra alfanumerica");
			flag = false;
		} else {
			GrupoConfianza gpo = (GrupoConfianza) grupoController
					.getByPK(nombreGrupoField.getText());
			if (gpo != null) {
				errorMessagesOnLabel(nombreGrupoField, msgNombreGrupo,
						"El nombre del Grupo ya esta en uso, proporcione uno diferente");
				flag = false;
			}
		}
		if (!v.isValidWord(descripcionGrupoField.getText())) {
			errorMessagesOnLabel(descripcionGrupoField, msgDescGrupo,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		return flag;
	}

	private boolean updateGrupo() {
		grupoConfianza.setDescripcion(descripcionGrupoField.getText());
		grupoConfianza.setPermisoDescarga(checkBoxDescarga.isSelected());
		grupoConfianza.setPermisoSubida(checkBoxCarga.isSelected());
		return grupoController.update(grupoConfianza);
	}

	private void setUpdateGrupo() {

		grupoConfianza = (GrupoConfianza) grupoController.getByPK(grupo);
		if (grupoConfianza != null) {
			nombreGrupoField.setText(grupoConfianza.getIdGrupo());
			descripcionGrupoField.setText(grupoConfianza.getDescripcion());
			checkBoxCarga.setSelected(grupoConfianza.isPermisoSubida());
			checkBoxDescarga.setSelected(grupoConfianza.isPermisoDescarga());

			nombreGrupoField.setEnabled(false);
		} else {
			JOptionPane.showMessageDialog(frameMessages,
					"Ocurrio un error de base de datos");
		}
	}

	private void iniciarGrupoDialog(String grupo) {
		this.grupo = grupo;
		createGrupoConfianzaDialog();
		if (grupo.equals("")) {
			cleanInputsGrupo();
			grupoConfianza = new GrupoConfianza();
			update = false;
		} else {
			setUpdateGrupo();
			update = true;
		}

	}

	private void createInvitacionDialog() {
		invitacionFrame = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		invitacionFrame
				.setIconImage(Toolkit
						.getDefaultToolkit()
						.getImage(
								GInterfaz.class
										.getResource("/icons/gnome-stock-mail-fwd.png")));
		invitacionFrame.setTitle("Invitar usuario");
		invitacionFrame.setBounds(100, 100, 372, 282);
		invitacionFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		invitacionFrame.getContentPane().setLayout(null);

		JLabel lblNombreDeUsuario = new JLabel("Nombre de Usuario invitado:");
		lblNombreDeUsuario.setBounds(50, 17, 143, 14);
		invitacionFrame.getContentPane().add(lblNombreDeUsuario);

		inviUsuario = new JTextField();
		inviUsuario.setBounds(203, 12, 143, 25);
		invitacionFrame.getContentPane().add(inviUsuario);
		inviUsuario.setColumns(10);

		lblPreguntaSecreta = new JLabel("Pregunta secreta:");
		lblPreguntaSecreta.setBounds(10, 57, 108, 15);
		invitacionFrame.getContentPane().add(lblPreguntaSecreta);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 83, 336, 105);
		invitacionFrame.getContentPane().add(scrollPane);

		preguntaText = new JTextArea();
		scrollPane.setViewportView(preguntaText);

		btnEnviar = new JButton();
		btnEnviar.setToolTipText("Enviar");
		btnEnviar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (usuarioController.exists(inviUsuario.getText().trim())) {
					String gpo = ((GrupoConfianza) comboGrupoOnGrupos
							.getSelectedItem()).getIdGrupo();
					if (validarInvitacion(inviUsuario.getText().trim(), gpo)) {
						boolean r = invController.createInvitacion(session
								.getUsername(), inviUsuario.getText().trim(),
								gpo, preguntaText.getText(), "", 1);
						if (r)
							message(OK, "Invitacion enviada al grupo: " + gpo);
						else
							message(ERROR,
									"No se pudo enviar la invitacion al grupo "
											+ gpo);
						preguntaText.setText("");
						inviUsuario.setText("");
						invitacionFrame.setVisible(false);
					} else {
						message(ERROR,
								"El usuario ya se encuentra en este grupo");
					}
				} else {
					message(ERROR, "Usuario inexistente");
				}
			}
		});
		btnEnviar.setIcon(new ImageIcon(InvitarGui.class
				.getResource("/icons/gnome-stock-mail-fwd.png")));
		btnEnviar.setBounds(306, 199, 40, 40);
		invitacionFrame.getContentPane().add(btnEnviar);

		JButton btnCancelar = new JButton("");
		btnCancelar.setToolTipText("Cancelar");
		btnCancelar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				invitacionFrame.setVisible(false);
				inviUsuario.setText("");
				preguntaText.setText("");
			}
		});
		btnCancelar.setIcon(new ImageIcon(InvitarGui.class
				.getResource("/icons/application-exit.png")));
		btnCancelar.setBounds(256, 199, 40, 40);
		invitacionFrame.getContentPane().add(btnCancelar);

		JLabel lblNewLabel = new JLabel("");
		lblNewLabel.setIcon(new ImageIcon(InvitarGui.class
				.getResource("/icons/emblem-personal.png")));
		lblNewLabel.setBounds(10, 7, 32, 30);
		invitacionFrame.getContentPane().add(lblNewLabel);

		invitacionFrame.addWindowListener(new java.awt.event.WindowAdapter() {
			@Override
			public void windowClosing(java.awt.event.WindowEvent windowEvent) {
				inviUsuario.setText("");
				preguntaText.setText("");
			}
		});
	}

	// RegistroUsuarioDialog
	private void createRegistroUsuarioDialog() {
		registroFrame = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		registroFrame.setTitle("Registro de Usuario");
		// registroFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(
		// MainWindow.class.getResource("/icons/n_user.png")));
		registroFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		registroFrame.setBounds(100, 100, 710, 271);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		registroFrame.setContentPane(contentPane);
		contentPane.setLayout(null);

		JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBorder(new TitledBorder(new EtchedBorder(

		EtchedBorder.LOWERED, null, null), "Registrarse",

		TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setBounds(10, 11, 674, 211);
		contentPane.add(panel);

		JLabel label = new JLabel("Nombre:");
		label.setBounds(90, 33, 57, 15);
		panel.add(label);

		JLabel label_1 = new JLabel("Apellido Paterno:");
		label_1.setBounds(90, 61, 95, 15);
		panel.add(label_1);

		JLabel label_2 = new JLabel("Apellido Materno:");
		label_2.setBounds(90, 89, 95, 15);
		panel.add(label_2);

		JLabel label_3 = new JLabel("E-Mail:");
		label_3.setBounds(380, 33, 46, 15);
		panel.add(label_3);

		JLabel label_4 = new JLabel("Contraseña:");
		label_4.setBounds(380, 64, 70, 15);
		panel.add(label_4);

		nombreField = new JTextField();
		nombreField.setBackground(Color.WHITE);
		nombreField.setColumns(10);
		nombreField.setBounds(205, 30, 114, 20);
		panel.add(nombreField);

		apPaternoField = new JTextField();
		apPaternoField.setColumns(10);
		apPaternoField.setBounds(205, 59, 114, 20);
		panel.add(apPaternoField);

		apMaternoField = new JTextField();
		apMaternoField.setColumns(10);
		apMaternoField.setBounds(205, 86, 114, 20);
		panel.add(apMaternoField);

		emailField = new JTextField();
		emailField.setColumns(10);
		emailField.setBounds(496, 33, 129, 20);
		panel.add(emailField);

		JLabel label_5 = new JLabel("Conf. Contraseña:");
		label_5.setBounds(380, 92, 122, 15);
		panel.add(label_5);

		JLabel label_6 = new JLabel("Usuario:");
		label_6.setBounds(90, 114, 46, 15);
		panel.add(label_6);

		usuarioField = new JTextField();
		usuarioField.setColumns(10);
		usuarioField.setBounds(205, 111, 114, 20);
		panel.add(usuarioField);

		JLabel label_7 = new JLabel("Sexo:");
		label_7.setBounds(380, 119, 46, 15);
		panel.add(label_7);

		sexoField = new JComboBox<String>();
		sexoField.setModel(new DefaultComboBoxModel<String>(new String[] { "H",
				"M" }));
		sexoField.setBounds(496, 117, 129, 22);
		panel.add(sexoField);

		JLabel label_8 = new JLabel("");
		label_8.setIcon(new ImageIcon(RegistroUsuarioDialog.class
				.getResource("/icons/format-text-direction-rtl.png")));
		label_8.setBounds(31, 33, 32, 89);
		panel.add(label_8);

		JButton registerButton = new JButton("Registrar");
		registerButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					saveUser();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		registerButton.setIcon(new ImageIcon(RegistroUsuarioDialog.class
				.getResource("/icons/dialog-ok.png")));
		registerButton.setBounds(537, 160, 114, 35);
		panel.add(registerButton);

		contrasenaField = new JPasswordField();
		contrasenaField.setBounds(496, 62, 129, 20);
		panel.add(contrasenaField);

		confirmarContrasenaField = new JPasswordField();
		confirmarContrasenaField.setBounds(496, 89, 129, 20);
		panel.add(confirmarContrasenaField);

		msgNombre = new JLabel("");
		msgNombre.setIcon(null);
		msgNombre.setBounds(329, 33, 16, 16);
		panel.add(msgNombre);

		msg_ApPaterno = new JLabel("");
		msg_ApPaterno.setBounds(329, 61, 16, 16);
		panel.add(msg_ApPaterno);

		msg_ApMaterno = new JLabel("");
		msg_ApMaterno.setBounds(329, 89, 16, 16);
		panel.add(msg_ApMaterno);

		msg_Usuario = new JLabel("");
		msg_Usuario.setBounds(329, 115, 16, 16);
		panel.add(msg_Usuario);

		msg_Email = new JLabel("");
		msg_Email.setBounds(635, 33, 16, 16);
		panel.add(msg_Email);

		msg_Contrasena = new JLabel("");
		msg_Contrasena.setBounds(635, 92, 16, 16);
		panel.add(msg_Contrasena);

		msg_Sexo = new JLabel("");
		msg_Sexo.setBounds(635, 119, 16, 16);
		panel.add(msg_Sexo);

		JButton button = new JButton("Cancelar");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				registroFrame.setVisible(false);
			}
		});
		button.setIcon(new ImageIcon(RegistroUsuarioDialog.class
				.getResource("/icons/window-close.png")));
		button.setBounds(417, 160, 110, 35);
		panel.add(button);

		registroFrame.addWindowListener(new java.awt.event.WindowAdapter() {
			@Override
			public void windowClosing(java.awt.event.WindowEvent windowEvent) {
				cleanUserInputs();
			}
		});
	}

	private void message(int type, String msg) {
		Color colorx = null;
		String icon = "";
		switch (type) {
		case ERROR:
			colorx = Color.decode("#9B0303");
			icon = "/icons/dialog-error.png";
			break;
		case INFO:
			colorx = Color.decode("#17666E");
			icon = "/icons/dialog-warning.png";
			break;
		case OK:
			colorx = Color.decode("#296E17");
			icon = "/icons/dialog-info.png";
			Toolkit.getDefaultToolkit().beep();
			break;
		}
		try {
			iconMessage
					.setIcon(new ImageIcon(GInterfaz.class.getResource(icon)));
			panelMessages.setBorder(new LineBorder(colorx, 1, true));
			textMessage.setForeground(colorx);
			textMessage.setText(msg.toUpperCase());
		} catch (NullPointerException ex) {
			ex.printStackTrace();
		}
	}

	private void errorMessagesOnLabel(JTextField field, JLabel error, String msj) {
		field.setBackground(new Color(255, 204, 204));
		error.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/msg_error.png")));
		error.setToolTipText(msj);
	}

	private void RunNotificaciones() {
		notify = new Thread() {
			public void run() {
				runQueries();
			}
		};
		notify.start();
	}

	private void runQueries() {
		while (threadFlag) {
			if (seleccionado) {
				try {
					logController.getAll(session.getUsername());
					List<Log> logs = logController
							.getAll(session.getUsername());
					// List<Log> logs=
					// logController.getAll(session.getUsername());
					invController.getPendientes(session.getUsername());
					List<Invitacion> pendientes = invController
							.getPendientes(session.getUsername());
					updateTables(pendientes, logs);
					Thread.sleep(3000);
				} catch (Exception e) {
					console.error("Comunicación interrumpida");
					threadFlag = false;
				}
			}
		}
	}

	private void updateTables(final List<Invitacion> pendientes,
			final List<Log> logs) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				fillTableNotifications(pendientes);
				fillTableLogs(logs);
			}
		});
	}

	private void fillTableLogs(List<Log> logs) {
		tableActividadGrupos.setModel(new DefaultTableModel(new Object[][] {},
				new String[] { "Usuario", "Grupo", "Archivo",
						"Accion realizada", "Fecha" }) {
			boolean[] columnEditables = new boolean[] { false, false, false,
					false, false };

			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		tableActividadGrupos.getColumnModel().getColumn(0).setResizable(false);
		tableActividadGrupos.getColumnModel().getColumn(1).setResizable(false);
		tableActividadGrupos.getColumnModel().getColumn(2).setResizable(false);
		tableActividadGrupos.getColumnModel().getColumn(3).setResizable(false);
		tableActividadGrupos.getColumnModel().getColumn(3)
				.setPreferredWidth(95);
		tableActividadGrupos.getColumnModel().getColumn(4).setResizable(false);
		DefaultTableModel modelo = (DefaultTableModel) tableActividadGrupos
				.getModel();
		Object row[] = { "", "", "", "", "", };
		String tipo = "";
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
		for (int i = 0; i < logs.size(); i++) {
			modelo.addRow(row);
			Archivo a = (Archivo) archivoController.getByPK(logs.get(i)
					.getFkArchivo());
			tableActividadGrupos.setValueAt(logs.get(i)
					.getFkUsuarioTransaccion(), i, 0);
			tableActividadGrupos.setValueAt(a.getFkGrupo(), i, 1);
			tableActividadGrupos.setValueAt(
					tools.getFileName(a.getRutaAcceso()), i, 2);
			switch (logs.get(i).getFkTipoTransaccion()) {
			case 1:
				tipo = "Carga";
				break;
			case 2:
				tipo = "Descarga";
				break;
			case 3:
				tipo = "Eliminación";
				break;
			}
			tableActividadGrupos.setValueAt(tipo, i, 3);
			tableActividadGrupos.setValueAt(
					format.format(logs.get(i).getFecha()), i, 4);
		}

	}

	private void fillTableNotifications(List<Invitacion> pendientes) {
		// console.info("" + pendientes.size());
		notiLabel.setText(pendientes.size() + "");
		tableNotifications.setModel(new DefaultTableModel(new Object[][] {},
				new String[] { "Usuario", "Grupo", "Tipo de notificacion",
						"tipo" }) {
			private static final long serialVersionUID = 1L;
			boolean[] columnEditables = new boolean[] { false, false, false,
					false, };

			public boolean isCellEditable(int row, int column) {
				return columnEditables[column];
			}
		});
		tableNotifications.setDefaultRenderer(ImageIcon.class,
				new ImageRender());
		DefaultTableModel modelo = (DefaultTableModel) tableNotifications
				.getModel();
		Object row[] = { "", "", "", "", };

		ImageIcon tipo = null;

		for (int i = 0; i < pendientes.size(); i++) {
			modelo.addRow(row);
			tableNotifications.setValueAt(pendientes.get(i).getId()
					.getFkGrupo(), i, 1);

			if (pendientes.get(i).getId().getFkUsuarioPropietario()
					.equals(session.getUsername())) {

				if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.INV_CONTESTADA) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/dialog-warning.png"));
					tipo.setDescription("Autorizar respuesta");
					tableNotifications.setValueAt(INV_AUTORIZAR, i, 3);
				} else if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.INV_RECHAZADA) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/system-restart-panel.png"));
					tipo.setDescription("Te han rechazado una invitaci\u00F3n");
					tableNotifications.setValueAt(INV_RECHAZADA, i, 3);
				}
				tableNotifications.setValueAt(pendientes.get(i).getId()
						.getFkInvitado()
						+ "", i, 0);
			} else {
				tableNotifications.setValueAt(pendientes.get(i).getId()
						.getFkUsuarioPropietario()
						+ "", i, 0);
				if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.USER_ELIMINADO) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/dialog-error.png"));
					tipo.setDescription("Te han eliminado de un grupo");
					tableNotifications.setValueAt(INV_COMPLETA, i, 3);
				}

				if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.GRUPO_ELIMINADO) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/dialog-error.png"));
					tipo.setDescription("Se ha eliminado un grupo");
					tableNotifications.setValueAt(INV_COMPLETA, i, 3);
				}

				if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.RESP_AUTORIZADA) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/dialog-info.png"));
					tipo.setDescription("Te han aceptado en un grupo");
					tableNotifications.setValueAt(INV_COMPLETA, i, 3);
				}
				if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.RESP_RECHAZADA) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/dialog-error.png"));
					tipo.setDescription("Te han rechazado de un grupo");
					tableNotifications.setValueAt(INV_COMPLETA, i, 3);
				}

				if (pendientes.get(i).getFkNotificacion() == TipoNotificacion.INV_ENVIADA) {
					tipo = new ImageIcon(
							GInterfaz.class
									.getResource("/icons/dialog-question.png"));
					tipo.setDescription("Te han invitado a un grupo");
					tableNotifications.setValueAt(INV_PENDIENTE, i, 3);
				}
			}
			tableNotifications.setValueAt(tipo, i, 2);
		}

		tableNotifications.getColumnModel().getColumn(3).setMaxWidth(0);
		tableNotifications.getColumnModel().getColumn(3).setMinWidth(0);
		tableNotifications.getColumnModel().getColumn(3).setWidth(0);
		tableNotifications.getColumnModel().getColumn(3).setPreferredWidth(0);
		tableNotifications.getColumnModel().getColumn(3).setResizable(false);
	}

	private void notificationAction(String user, String grupo, Integer tipo) {
		InvitacionId id = new InvitacionId();
		invitacion = new Invitacion();
		usuarioInvitado = user;
		grupoConfianza = (GrupoConfianza) grupoController.getByPK(grupo);

		if (tipo == INV_AUTORIZAR || tipo == INV_RECHAZADA) {
			id.setFkGrupo(grupo);
			id.setFkInvitado(user);
			id.setFkUsuarioPropietario(session.getUsername());
			invitacion = (Invitacion) invController.getByPK(id);
			if (tipo == INV_AUTORIZAR) {
				lblUsuario.setText("\"" + user + "\" ?");
				lblGrupo.setText(grupo);
				autorizarPregunta.setText(invitacion.getPregunta());
				autorizarRespuesta.setText(invitacion.getRespuesta());
				userAnadir = (Usuario) usuarioController.getByPK(user);
				autorizarInvFrame.setVisible(true);
			} else {
				JOptionPane.showMessageDialog(frameMessages, "El usuario '"
						+ invitacion.getId().getFkInvitado()
						+ "' ha rechazado tu invitación al grupo \""
						+ invitacion.getId().getFkGrupo() + "\".");
				invController.delete(id);
			}
		} else {
			id.setFkGrupo(grupo);
			id.setFkInvitado(session.getUsername());
			id.setFkUsuarioPropietario(user);
			invitacion = (Invitacion) invController.getByPK(id);
			if (tipo == INV_COMPLETA) {
				if (invitacion.getFkNotificacion() == TipoNotificacion.RESP_AUTORIZADA) {
					JOptionPane.showMessageDialog(frameMessages,
							"Te han aceptado en el grupo \""
									+ invitacion.getId().getFkGrupo()
									+ "\" ahora puedes transaccionar en el");
					fillGruposList(grupoController.getAllGroupsByUser(session
							.getUsername()));
					invController.delete(id);
				}
				if (invitacion.getFkNotificacion() == TipoNotificacion.RESP_RECHAZADA) {
					JOptionPane.showMessageDialog(frameMessages,
							"Te han rechazado de pertenecer al grupo \""
									+ invitacion.getId().getFkGrupo() + "\"");
					invController.delete(id);
				}
				if (invitacion.getFkNotificacion() == TipoNotificacion.USER_ELIMINADO) {
					JOptionPane.showMessageDialog(frameMessages,
							"Te han eliminado del grupo \""
									+ invitacion.getId().getFkGrupo()
									+ "\" ya no puedes transaccionar en el");
					fillGruposList(grupoController.getAllGroupsByUser(session
							.getUsername()));
					invController.delete(id);
				}
				if (invitacion.getFkNotificacion() == TipoNotificacion.GRUPO_ELIMINADO) {
					JOptionPane.showMessageDialog(frameMessages,
							"Se ha eliminado grupo \""
									+ invitacion.getId().getFkGrupo()
									+ "\" ya no puedes transaccionar en el");
					fillGruposList(grupoController.getAllGroupsByUser(session
							.getUsername()));
					invController.delete(id);
				}

			} else {
				responderLblUsuario.setText("\"" + user + "\" ?");
				responderLblGrupo.setText(grupo);
				responderPregunta.setText(invitacion.getPregunta());
				responderInvFrame.setVisible(true);
			}
		}

	}

	private void createAutorizarInvDialog() {
		autorizarInvFrame = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		autorizarInvFrame.setTitle("Autorizar Respuesta");
		autorizarInvFrame.setBounds(100, 100, 420, 291);
		autorizarInvFrame.getContentPane().setLayout(new BorderLayout());

		JPanel contentPanel = new JPanel();
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		autorizarInvFrame.getContentPane().add(contentPanel,
				BorderLayout.CENTER);
		contentPanel.setLayout(null);

		JLabel lblPregunta = new JLabel("Pregunta:");
		lblPregunta.setBounds(10, 63, 58, 21);
		contentPanel.add(lblPregunta);

		JButton okButton = new JButton("");
		okButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				invController.doAutorizar(invitacion);
				grupoConfianza.getUsuarios().add(userAnadir);
				grupoController.update(grupoConfianza);
				fillGruposList(grupoController.getAllGroupsByUser(session
						.getUsername()));
				fillTableNotifications(invController.getPendientes(session
						.getUsername()));
				autorizarInvFrame.setVisible(false);
			}
		});
		okButton.setToolTipText("Aceptar");
		okButton.setIcon(new ImageIcon(AutorizarInvDialog.class
				.getResource("/icons/dialog-ok.png")));
		okButton.setBounds(245, 201, 43, 41);
		contentPanel.add(okButton);

		JButton otherQuestionButtton = new JButton("");
		otherQuestionButtton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				createInvitacionDialog();
				inviUsuario.setText(usuarioInvitado);
				inviUsuario.setEditable(false);
				autorizarInvFrame.setVisible(false);
				invitacionFrame.setVisible(true);
			}
		});
		otherQuestionButtton.setToolTipText("Realizar otra pregunta");
		otherQuestionButtton.setIcon(new ImageIcon(AutorizarInvDialog.class
				.getResource("/icons/gnome-stock-mail-fwd.png")));
		otherQuestionButtton.setBounds(298, 201, 43, 41);
		contentPanel.add(otherQuestionButtton);

		JButton cancelButton = new JButton("");
		cancelButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				invController.doRechazar(invitacion);
				fillTableNotifications(invController.getPendientes(session
						.getUsername()));
				autorizarInvFrame.setVisible(false);
			}
		});
		cancelButton.setIcon(new ImageIcon(AutorizarInvDialog.class
				.getResource("/icons/application-exit.png")));
		cancelButton.setToolTipText("Rechazar");
		cancelButton.setBounds(351, 201, 43, 41);
		contentPanel.add(cancelButton);
		cancelButton.setActionCommand("Cancel");

		JLabel lblRespuesta = new JLabel("Respuesta:");
		lblRespuesta.setBounds(10, 126, 58, 21);
		contentPanel.add(lblRespuesta);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(78, 46, 312, 54);
		contentPanel.add(scrollPane);

		autorizarPregunta = new JTextArea();
		scrollPane.setViewportView(autorizarPregunta);
		autorizarPregunta.setFont(new Font("Tahoma", Font.PLAIN, 12));
		autorizarPregunta.setBackground(SystemColor.controlHighlight);
		autorizarPregunta.setEditable(false);

		JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(78, 111, 312, 54);
		contentPanel.add(scrollPane_1);

		autorizarRespuesta = new JTextArea();
		scrollPane_1.setViewportView(autorizarRespuesta);
		autorizarRespuesta.setFont(new Font("Tahoma", Font.PLAIN, 12));
		autorizarRespuesta.setBackground(SystemColor.controlHighlight);
		autorizarRespuesta.setEditable(false);

		JLabel lblconfiasEnLa = new JLabel(
				"\u00BFConfias en la respuesta del usuario");
		lblconfiasEnLa.setBounds(109, 176, 179, 14);
		contentPanel.add(lblconfiasEnLa);

		lblUsuario = new JLabel("");
		lblUsuario.setBounds(284, 176, 110, 14);
		contentPanel.add(lblUsuario);

		JLabel lblGpo = new JLabel("Grupo:");
		lblGpo.setBounds(10, 11, 46, 24);
		contentPanel.add(lblGpo);

		lblGrupo = new JLabel("");
		lblGrupo.setEnabled(false);
		lblGrupo.setBackground(SystemColor.controlHighlight);
		lblGrupo.setBounds(78, 11, 304, 24);
		contentPanel.add(lblGrupo);
	}

	private void createResponderInvDialog() {
		responderInvFrame = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		responderInvFrame.setTitle("Responder invitaci\u00F3n");
		responderInvFrame.setBounds(100, 100, 420, 291);
		responderInvFrame.getContentPane().setLayout(new BorderLayout());
		JPanel contentPanel = new JPanel();
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		responderInvFrame.getContentPane().add(contentPanel,
				BorderLayout.CENTER);
		contentPanel.setLayout(null);

		JLabel lblPregunta = new JLabel("Pregunta:");
		lblPregunta.setBounds(10, 63, 58, 21);
		contentPanel.add(lblPregunta);

		JButton okButton = new JButton("");
		okButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				invitacion.setRespuesta(responderRespuesta.getText());
				invitacion.setFkNotificacion(TipoNotificacion.INV_CONTESTADA);
				invController.update(invitacion);
				fillTableNotifications(invController.getPendientes(session
						.getUsername()));
				responderInvFrame.setVisible(false);
				responderRespuesta.setText("");
			}
		});
		okButton.setToolTipText("Aceptar invitaci\u00F3n");
		okButton.setIcon(new ImageIcon(AutorizarInvDialog.class
				.getResource("/icons/dialog-ok.png")));
		okButton.setBounds(351, 201, 43, 41);
		contentPanel.add(okButton);

		JButton cancelButton = new JButton("");
		cancelButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				invitacion.setFkNotificacion(TipoNotificacion.INV_RECHAZADA);
				invController.update(invitacion);
				fillTableNotifications(invController.getPendientes(session
						.getUsername()));
				responderInvFrame.setVisible(false);
			}
		});
		cancelButton.setIcon(new ImageIcon(AutorizarInvDialog.class
				.getResource("/icons/application-exit.png")));
		cancelButton.setToolTipText("Rechazar invitaci\u00F3n");
		cancelButton.setBounds(298, 201, 43, 41);
		contentPanel.add(cancelButton);
		cancelButton.setActionCommand("Cancel");

		JLabel lblRespuesta = new JLabel("Respuesta:");
		lblRespuesta.setBounds(10, 126, 58, 21);
		contentPanel.add(lblRespuesta);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(78, 46, 312, 54);
		contentPanel.add(scrollPane);

		responderPregunta = new JTextArea();
		scrollPane.setViewportView(responderPregunta);
		responderPregunta.setFont(new Font("Tahoma", Font.PLAIN, 12));
		responderPregunta.setBackground(SystemColor.controlHighlight);
		responderPregunta.setEditable(false);

		JScrollPane scrollPane_1 = new JScrollPane();
		scrollPane_1.setBounds(78, 111, 312, 54);
		contentPanel.add(scrollPane_1);

		responderRespuesta = new JTextArea();
		scrollPane_1.setViewportView(responderRespuesta);
		responderRespuesta.setFont(new Font("Tahoma", Font.PLAIN, 12));
		responderRespuesta.setBackground(Color.WHITE);

		JLabel lblconfiasEnLa = new JLabel(
				"\u00BFQu\u00E9 deseas realizar con la invitaci\u00F3n del usuario");
		lblconfiasEnLa.setBounds(54, 176, 241, 14);
		contentPanel.add(lblconfiasEnLa);

		responderLblUsuario = new JLabel("");
		responderLblUsuario.setBounds(295, 176, 99, 14);
		contentPanel.add(responderLblUsuario);

		JLabel lblGpo = new JLabel("Grupo:");
		lblGpo.setBounds(10, 11, 46, 24);
		contentPanel.add(lblGpo);

		responderLblGrupo = new JLabel("");
		responderLblGrupo.setEnabled(false);
		responderLblGrupo.setBackground(SystemColor.controlHighlight);
		responderLblGrupo.setBounds(78, 11, 304, 24);
		contentPanel.add(responderLblGrupo);
	}

	public void createEditarUserDialog() {
		editUserDialog = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		editUserDialog.setTitle("Editar Usuario");
		editUserDialog.setIconImage(Toolkit.getDefaultToolkit().getImage(
				GInterfaz.class.getResource("/icons/emblem-personal.png")));
		editUserDialog.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		editUserDialog.setBounds(100, 100, 620, 230);
		contentPaneEditUser = new JPanel();
		contentPaneEditUser.setBorder(new EmptyBorder(5, 5, 5, 5));
		editUserDialog.setContentPane(contentPaneEditUser);
		contentPaneEditUser.setLayout(null);

		JPanel panel = new JPanel();
		panel.setLayout(null);
		panel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED,
				null, null), "Editar", TitledBorder.LEADING, TitledBorder.TOP,
				null, null));
		panel.setBounds(10, 11, 590, 177);
		contentPaneEditUser.add(panel);

		JLabel label = new JLabel("Nombre:");
		label.setBounds(310, 31, 57, 15);
		panel.add(label);

		JLabel label_1 = new JLabel("Apellido Paterno:");
		label_1.setBounds(310, 59, 95, 15);
		panel.add(label_1);

		JLabel label_2 = new JLabel("Apellido Materno:");
		label_2.setBounds(310, 87, 95, 15);
		panel.add(label_2);

		JLabel label_3 = new JLabel("E-Mail:");
		label_3.setBounds(52, 58, 46, 15);
		panel.add(label_3);

		nombreFieldEdit = new JTextField();
		nombreFieldEdit.setBackground(Color.WHITE);
		nombreFieldEdit.setColumns(10);
		nombreFieldEdit.setBounds(425, 28, 114, 20);
		panel.add(nombreFieldEdit);

		apPaternoFieldEdit = new JTextField();
		apPaternoFieldEdit.setColumns(10);
		apPaternoFieldEdit.setBounds(425, 57, 114, 20);
		panel.add(apPaternoFieldEdit);

		apMaternoFieldEdit = new JTextField();
		apMaternoFieldEdit.setColumns(10);
		apMaternoFieldEdit.setBounds(425, 84, 114, 20);
		panel.add(apMaternoFieldEdit);

		emailFieldEdit = new JTextField();
		emailFieldEdit.setColumns(10);
		emailFieldEdit.setBounds(125, 52, 129, 20);
		panel.add(emailFieldEdit);

		JLabel label_6 = new JLabel("Usuario:");
		label_6.setBounds(52, 27, 46, 15);
		panel.add(label_6);

		usuarioFieldEdit = new JTextField();
		usuarioFieldEdit.setEditable(false);
		usuarioFieldEdit.setColumns(10);
		usuarioFieldEdit.setBounds(124, 27, 130, 20);
		panel.add(usuarioFieldEdit);

		JLabel label_7 = new JLabel("Sexo:");
		label_7.setBounds(52, 86, 46, 15);
		panel.add(label_7);

		sexoFieldEdit = new JComboBox<String>();
		sexoFieldEdit.setModel(new DefaultComboBoxModel<String>(new String[] {
				"H", "M" }));
		sexoFieldEdit.setBounds(125, 82, 129, 22);
		panel.add(sexoFieldEdit);

		JLabel label_8 = new JLabel("");
		label_8.setIcon(new ImageIcon(RegistroUsuarioDialog.class
				.getResource("/icons/format-text-direction-rtl.png")));
		label_8.setBounds(10, 15, 32, 89);
		panel.add(label_8);

		JButton registerButton = new JButton("Editar");
		registerButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Usuario u = (Usuario) usuarioController.getByPK(session
						.getUsername());
				if (u != null) {
					if (validateEditUser()) {
						u.setNombre(nombreFieldEdit.getText());
						u.setApPaterno(apPaternoFieldEdit.getText());
						u.setApMaterno(apMaternoFieldEdit.getText());
						u.setEmail(emailFieldEdit.getText());
						u.setSexo(sexoFieldEdit.getSelectedItem().toString()
								.charAt(0));
						if (usuarioController.update(u)) {
							editUserDialog.setVisible(false);
							JOptionPane.showMessageDialog(frameMessages,
									"Datos actualizados correctamente.",
									"Actualización de datos",
									JOptionPane.INFORMATION_MESSAGE);
							nombreFieldEdit.setText("");
							apPaternoFieldEdit.setText("");
							apMaternoFieldEdit.setText("");
							emailFieldEdit.setText("");
							usuarioFieldEdit.setText("");
						}
					}
				}
			}
		});
		registerButton.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/dialog-ok.png")));
		registerButton.setBounds(459, 126, 114, 35);
		panel.add(registerButton);

		editMsg_Nombre = new JLabel("");
		editMsg_Nombre.setIcon(null);
		editMsg_Nombre.setBounds(549, 30, 16, 16);
		panel.add(editMsg_Nombre);

		editMsg_ApPaterno = new JLabel("");
		editMsg_ApPaterno.setBounds(549, 58, 16, 16);
		panel.add(editMsg_ApPaterno);

		editMsg_ApMaterno = new JLabel("");
		editMsg_ApMaterno.setBounds(549, 86, 16, 16);
		panel.add(editMsg_ApMaterno);

		editMsg_Email = new JLabel("");
		editMsg_Email.setBounds(264, 52, 16, 16);
		panel.add(editMsg_Email);

		JButton button = new JButton("Cancelar");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				editUserDialog.setVisible(false);
				nombreFieldEdit.setText("");
				apPaternoFieldEdit.setText("");
				apMaternoFieldEdit.setText("");
				emailFieldEdit.setText("");
				usuarioFieldEdit.setText("");
			}
		});
		button.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/window-close.png")));
		button.setBounds(339, 126, 110, 35);
		panel.add(button);
	}

	private void createCambioPassDialog() {
		cambioPassDialog = new JDialog(frameMessages,
				Dialog.ModalityType.APPLICATION_MODAL);
		cambioPassDialog.setIconImage(Toolkit.getDefaultToolkit().getImage(
				GInterfaz.class
						.getResource("/icons/emblem-dropbox-unsyncable.png")));
		cambioPassDialog.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		cambioPassDialog.setBounds(100, 100, 316, 177);
		contentPanePassChange = new JPanel();
		contentPanePassChange.setBorder(new EmptyBorder(5, 5, 5, 5));
		cambioPassDialog.setContentPane(contentPanePassChange);
		contentPanePassChange.setLayout(null);

		JLabel lblContraseaActual = new JLabel("Contrase\u00F1a actual:");
		lblContraseaActual.setBounds(10, 11, 102, 14);
		contentPanePassChange.add(lblContraseaActual);

		currentPass = new JPasswordField();
		currentPass.setBounds(132, 8, 156, 20);
		contentPanePassChange.add(currentPass);

		JLabel lblNewLabel = new JLabel("Nueva contrase\u00F1a:");
		lblNewLabel.setBounds(10, 39, 102, 14);
		contentPanePassChange.add(lblNewLabel);

		JLabel lblConfirmarContrasea = new JLabel("Confirmar contrase\u00F1a:");
		lblConfirmarContrasea.setBounds(10, 67, 117, 14);
		contentPanePassChange.add(lblConfirmarContrasea);

		newPass1 = new JPasswordField();
		newPass1.setBounds(132, 39, 156, 20);
		contentPanePassChange.add(newPass1);

		newPass2 = new JPasswordField();
		newPass2.setBounds(132, 64, 156, 20);
		contentPanePassChange.add(newPass2);

		JButton btnNewButton = new JButton("");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Usuario usuario = (Usuario) usuarioController.getByPK(session
						.getUsername());
				if (usuario != null
						&& usuario.getPassword().equals(currentPass.getText())) {
					if (newPass1.getText().equals(newPass2.getText())) {
						usuario.setPassword(newPass1.getText());
						if (usuarioController.update(usuario)) {
							cambioPassDialog.setVisible(false);
							JOptionPane.showMessageDialog(frameMessages,
									"Contraseña cambiada exitosamente.",
									"Cambio de contraseña",
									JOptionPane.INFORMATION_MESSAGE);
							currentPass.setText("");
							newPass1.setText("");
							newPass2.setText("");
						} else {
							JOptionPane.showMessageDialog(frameMessages,
									"No fue posible actualizar la contraseña.",
									"Error", JOptionPane.ERROR_MESSAGE);
						}
					} else {
						JOptionPane.showMessageDialog(frameMessages,
								"Las contraseñas no coinciden.",
								"Error de validación",
								JOptionPane.ERROR_MESSAGE);
					}
				} else {
					JOptionPane.showMessageDialog(frameMessages,
							"La contraseña actual es incorrecta.",
							"Error de validación", JOptionPane.ERROR_MESSAGE);
				}
			}
		});
		btnNewButton.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-dropbox-uptodate.png")));
		btnNewButton.setBounds(256, 95, 32, 32);
		contentPanePassChange.add(btnNewButton);

		JButton button = new JButton("");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				cambioPassDialog.setVisible(false);
				currentPass.setText("");
				newPass1.setText("");
				newPass2.setText("");
			}
		});
		button.setIcon(new ImageIcon(GInterfaz.class
				.getResource("/icons/emblem-noread.png")));
		button.setBounds(214, 95, 32, 32);
		contentPanePassChange.add(button);
	}

	private boolean validarInvitacion(String invitado, String grupo) {
		Usuario user = (Usuario) usuarioController.getByPK(invitado);
		GrupoConfianza grupoConfianza = (GrupoConfianza) grupoController
				.getByPK(grupo);
		Set<Usuario> usuarios = grupoConfianza.getUsuarios();
		if (usuarios.contains(user)) {
			return false;
		}
		return true;
	}

	private void cleanAll() {
		// Grupos
		descripcionGrupoShow.setText("");
		chckbxCargaShow.setSelected(false);
		chckbxDescargaShow.setSelected(false);
		DefaultTableModel model = new DefaultTableModel();
		model.setColumnIdentifiers(colusername);
		membersTable.setModel(model);

		// archivos
		tableArchivos
				.setModel(new DefaultTableModel(new Object[][] {},
						new String[] { "", "Nombre", "Tama\u00F1o",
								"Fecha de subida" }));
		tableArchivos.getColumnModel().getColumn(0).setMaxWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setMinWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setPreferredWidth(0);
		tableArchivos.getColumnModel().getColumn(0).setResizable(false);
	}

	private boolean validateEditUser() {
		Validator v = new Validator();
		boolean flag = true;
		cleanUserEditErrors();

		if (!v.isValidWord(nombreFieldEdit.getText())) {
			errorMessagesOnLabel(nombreFieldEdit, editMsg_Nombre,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		if (!v.isValidWord(apPaternoFieldEdit.getText())) {
			errorMessagesOnLabel(apPaternoFieldEdit, editMsg_ApPaterno,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		if (!v.isValidWord(apMaternoFieldEdit.getText())) {
			errorMessagesOnLabel(apMaternoFieldEdit, editMsg_ApMaterno,
					"El formato es incorrecto, Solo letras y espacios");
			flag = false;
		}
		if (!v.isEmail(emailFieldEdit.getText())) {
			errorMessagesOnLabel(emailFieldEdit, editMsg_Email,
					"El formato del email es incorrecto, Ej: nombre@dominio.com");
			flag = false;
		}
		return flag;

	}

	private void cleanUserEditErrors() {
		nombreFieldEdit.setBackground(Color.WHITE);
		apPaternoFieldEdit.setBackground(Color.WHITE);
		apMaternoFieldEdit.setBackground(Color.WHITE);
		emailFieldEdit.setBackground(Color.WHITE);

		editMsg_Nombre.setIcon(null);
		editMsg_ApPaterno.setIcon(null);
		editMsg_ApMaterno.setIcon(null);
		editMsg_Email.setIcon(null);
	}
}
